// token 模块
import {
   getToken,
   setToken,
   removeToken,
   setTimeStamp
} from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
// 导入重置路由的函数
import { resetRouter } from '../../router'
const state = {
   // 获取token
   token: getToken(),

   // 用户资料
   // 这里定义一个空对象，不定义为 null
   // 因为要进行 getters 快捷访问
   userInfo: {}
}
const mutations = {
   // 处理token
   setToken(state, token) {
      // 保存到 vuex
      state.token = token
      // 同步给缓存
      setToken(token)
   },
   removeToken() {
      state.token = null
      removeToken()
   },
   // 处理用户资料
   setUserInfo(state, result) {
      // 更新一个对象
      // 这样是响应式
      state.userInfo = result
      // 属于浅拷贝，也是响应式
      // state.userInfo = { ...result }
      // 不是响应式
      // state.userInfo['userInfo'] = result
   },
   removeUserInfo(state) {
      state.userInfo = {}
   }
}
const actions = {
   // 处理token
   async login(context, data) {
      // const result = await login(data)
      // if (result.data.success) {
      //    // result.data.data 拿到token
      //    context.commit('setToken', result.data.data)
      // }
      // 拿到token
      const result = await login(data)
      // 设置token 已经在响应拦截器解构处理过了
      context.commit('setToken', result)
      setTimeStamp()
   },
   // 处理用户资料
   async getUserInfo(context) {
      const result = await getUserInfo()
      const baseInfo = await getUserDetailById(result.userId)
      // 合并
      const obj = { ...result, ...baseInfo }
      // 修改到 mutations 中
      context.commit('setUserInfo', obj)
      // 这里的 return 是给我们后期做权限时 留下伏笔
      return result
   },
   // 登出操作
   logout(context) {
      // 删除token 调用 mutation
      context.commit('removeToken')
      // 删除用户资料
      context.commit('removeUserInfo')
      // 重置路由
      resetRouter()
      // 去设置权限模块下的路由为初始状态
      // Vuex 子模块调用子模块的 action，都没加锁的情况，可以随意调用
      // 不加命名空间的情况下，所有的mutation 跟action都是挂在全局上的，所以可以直接调用
      // 但是加了命名空间的子模块怎么调用另一个加了命名空间的子模块的mutation
      // 加了命名空间的context指的不是全局的context
      // 1. mutation 名称，2. 载荷payload 3. {root: true} 表示调用根级的 mutation 或者 action
      context.commit('permission/setRoutes', [], { root: true })
   }
}
export default {
   namespaced: true,
   state,
   mutations,
   actions
}
